[求助]汇编问题!

来源:百度知道 编辑:UC知道 时间:2024/06/08 22:47:25
我写了如下代码,目的是在屏幕上显示三个字符串:welcome to masm!
代码:
assume cs:code

data segment
db 'welcome to masm!'
db 2h,24h,71h

data ends

stack segment
dw 8 dup (0)
stack ends

code segment
start: mov ax,stack
mov ss,ax
mov sp,16
mov ax,data
mov ds,ax
mov ax,0b872h
mov es,ax

mov si,16
mov cx,6

s1: push cx
push ax

mov bx,0
mov di,0
mov cx,16

s2: mov al,[bx]
mov es:[di],al
mov al,ds:[si]
mov es:[di+1],al
add di,2
inc bx
loop s2

inc si
pop ax
add ax,0a0h
mov es,ax
pop cx
loop s1

mov ax,4c00h
int 21h
code ends
end start
现在的问题是,程序每次运行,都只显示第一行字符串。似乎次数为3的外循环只循环了一次,请教各位高手,问题出在哪?
不好意思,外循环确实是6。我提问时没有注意,原本是3,后来改成6了之后,忘了改回去。
不过,这似乎不重要。因为,外循环执行一次后程序便终止了。屏幕上只会出现一行“welcome to masm!”。
有没有哪位朋友可以帮我调试一下这个程序啊

用masm测试了下你的代码,输出了3排“welcome to masm!”,没有你说的问题,你试着把你的cmd窗口高度或者输出缓冲区调大点...

外循环次数不是6么?

方便告诉我你用的是哪种单片机么?
好像是你的进出堆栈有些问题

既然你控制内循环是16了也就是说已经可以把整个字符串复制到显存去了,你后面的2h,24h,71h有什么用??
换一行的功能你也是把es增加相应大小来实现的
至于显示出一行,莫非是你的es增加的值有点问题??其他地方代码,我看过了没有逻辑问题!估计问题就出在这里吧!!

我调试成功了
唉弄了2个小时,终于整出来了,你看我这个对比一下
全屏运行

assume cs:code,ds:data,ss:stack
data segment
db 'welcome to masm!' ;定义要显示的字符串(共16字节)
db 02h,24h,71h ;定义三种颜色属性
data ends
stack segment
dw 8 dup(0)
stack ends
code segment
start:
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,10h
mov bx,0
mov di,0
mov ax,0b872h ;算出屏幕第12行中间的显存的段起始位置放入ax中
mov cx,3 ;外循环为3次,因为要显示三个字符串
s3: push cx ;三个进栈操作为外循环s3保存相关寄存器的值
push ax ;以防止它们的值在内循环中被破坏
push di
mov es,ax ;此时es为屏幕第12行中间的显存的段起始位置
mov si,0
mov di,0
mov cx,10h ;内循环为10h次,因为一个字符串中含10h个字节
s1: mov al,ds:[bx+si]
mov es:[bx